1、最长回文子串
思想：动态规划，f(i,j)表示i到j之间的字符串是否为回文
class Solution {
public:
    string longestPalindrome(string s) {
        string s1;
        if(s.empty())
            return s1;
        vector<vector<int>> vv(s.size(),vector<int>(s.size()));
        for(int length=0;length<s.size();length++)
        {
            for(int left=0;left<s.size()-length;left++)
            {
                int right=left+length;
                if(length==0)
                {
                    vv[left][right]=1;
                }
                else if(length==1)
                {
                    if(s[left]==s[right])
                        vv[left][right]=1;
                }
                else 
                {
                    if(s[left]==s[right]&&vv[left+1][right-1])
                        vv[left][right]=1;
                }
                if(vv[left][right]&&s1.size()<length+1)
                    s1=s.substr(left,length+1);
            }
        }
        return s1;
    }
};

2、z字行变换，就是将一个字符串按照z字行重新排列
思想：利用一个curRow和flag用来表示哪一行，按照行依次将数据输入进去，如果为首行，则向下行插入数据，如果是尾行，则按照向上行插入数据
class Solution {
public:
    string longestPalindrome(string s) {
        string s1;
        if(s.empty())
            return s1;
        vector<vector<int>> vv(s.size(),vector<int>(s.size()));
        for(int length=0;length<s.size();length++)
        {
            for(int left=0;left<s.size()-length;left++)
            {
                int right=left+length;
                if(length==0)
                {
                    vv[left][right]=1;
                }
                else if(length==1)
                {
                    if(s[left]==s[right])
                        vv[left][right]=1;
                }
                else 
                {
                    if(s[left]==s[right]&&vv[left+1][right-1])
                        vv[left][right]=1;
                }
                if(vv[left][right]&&s1.size()<length+1)
                    s1=s.substr(left,length+1);
            }
        }
        return s1;
    }
};